home *** CD-ROM | disk | FTP | other *** search
- {
- From: ELAD NACHMAN
- Subj: High Speed COM I/O
- ---------------------------------------------------------------------------
- RL> Dose anyone know how a humble young TP programmer can access
- RL> modems at speeds of say 57,600 baud rates? I would love even
- RL> 14,400 routines. I had a set of simple I/O routines, but speeds
- RL> over 2400 term programs would lose characters. I would like to
- RL> write some doors for a BBS but can't break the 2400 limit.
-
- You probably use a very simple way, which doesn't envolves capturing the
- modem's Com port IRQ. That's why you use chars over faster transmitions.
- To make sure the program will be fast, optimize it to assembler, or at least
- use I/O Ports manipulations (If you odn't use it already).
- A cut from a source I have here (Design for com1, if you need support for other
- ports use a guide such as Helppc. If you want To write Doors for BBSes you
- better use Fossil functions, For that either use Fsildoc.??? (It's in several
- FTP sites) or Ralf Brown's Interrupt list):
- }
-
- const
-
- { 8250 IRQ Registers }
-
- Data=$03f8; { Contains 8 bits for send/receive }
-
- IER=$03f9; { Enables Serial Port when set to 1 }
-
- LCR=$03fb; { Sets communication Parameters }
-
- MCR=$03FC; { bits 1,2,4 are turned on to ready modems }
-
- LSR=$3FD; { when bit 6 is on, it is safe to send a byte }
-
- MDMMSR=$03FE; { initialized to $80 when starting }
-
- ENBLRDY=$01; { initial value for port[IER] }
-
- MDMMOD=$0b; { initial value for port[MCR] }
-
- MDMCD=$80; { initial value for port[MDMMSR] }
-
- INTCTLR=$21; { port for 8259 interrupt controller }
-
- var
-
- mybyte:byte;
- vector:pointer;
-
-
- procedure asyncint; interrupt;
- begin
- inline($FB); {STI}
- mybyte:=port[dataport];
- inline($FA); {CLI}
-
- Port[$20]:=$20;
-
- end;
-
- procedure setmodem;
- var
- regs: registers;
- parm : byte;
-
- begin
-
- parm:=3+4+0+$d0;
- {8 databits,1 stopbit,no parity,9600 baud}
- {databits: values 0,1,2,3 represent 5,6,7,8 databits
- stopbits: value 4 is for 1 stopbits, 0 for none
- parity: value 0 or $10 for none, $8 for odd, $18 for even
- baud: $d0 for 9600, $b0 for 4800, $a0 for 2400, $80 for 1200, $60 for 600, $40
- for 300 add all this values and get the correct byte parameter}
-
- with regs do
- begin
- dx:=0; { comport -1 }
- ah:=0;
- al:=parm;
- flags:=0;
- intr($14,regs);
- end;
- end;
-
- procedure EnablePorts;
- var
- b: byte;
- begin
- getintvec($0c,Vector); { $0c is for com1/com3 - IRQ 4 }
- setintvec($0c,@AsyncInt);
- b:=port[INTCTLR];
- b:=b and $0ef;
- port[INTCTLR]:=b;
- b:=port[LCR];
- b:=b and $7f;
-
- port[lcr]:=b;
- port[ier]:=enblrdy;
- port[mcr]:=$08 or MDMMOD;
- port[mdmmsr]:=mdmcd;
- port[$20]:=$20;
-
- { when: port[MDMMSR] and $80 = $80 then there's carrier }
-
- procedure sendchartoport(b: byte);
- begin
- while ( (port[lsr] and $20) <> $20 ) do
- begin
- end;
- port[dataport]:=b;
- end;
-
- procedure sendstringtoport(s: string);
- var
- i:integer;
- begin
- for i:=1 to length(s) do
- sendchartoport(ord(S[i]));
- snedchartoport(13);
- end;
-
- procedure disableports;
- var
- b: byte;
- begin
- sendstringtoport('ATC0');
- b:=port[intctlr];
- b:=b or $10;
- port[intctlr]:=b;
- b:=port[lcr];
- b:=b and $7f;
- port[lcr]:=b;
- port[ier]:=$0;
-
- port[mcr]:=$0;
- port[$20]:=$20;
- setintvec($0c,vector);
- end;
-
- { How the program itself should generally be }
-
- begin
-
- setmodem;
- enableports;
- send strings or chars
- disableports;
-
- end.